home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldglx08
/
ldglx08s.lzh
/
LDGLX.S
< prev
next >
Wrap
Text File
|
1997-09-20
|
56KB
|
2,486 lines
*********************************************************************************
* GLx Loader <LDGLX.X Ver. 0.08> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xref _Gxput
.text
.even
start:
lea.l mysp(pc),sp *スタックセット
lea.l 16(a0),a0 *余分なメモリ開放
suba.l a0,a1
move.l a1,-(sp)
move.l a0,-(sp)
DOS _SETBLOCK
addq.l #8,sp
bsr cmdchk *コマンドラインの解析
bsr buf_get *バッファ確保
bsr super *スーパーモードへ
bsr cursol_clr *カーソル消す
bsr name_get *ファイル名を取得し処理する
bsr user *ユーザモードへ
bsr buf_free *バッファ開放
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
clr.w file_cnt *ファイル数のカウント初期化
move.l buff_addr(pc),gr_addr *画像アドレス初期化
bsr pal_set *パレットの初期化
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg1(pc) *
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
tst.b esc_flg *エスケープ?
bne done
pea.l filbuf(pc) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
bsr rw_chk *画面の描き直し
bsr file_cnt_chk *処理したファイル数のチェック
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(pc) *ファイル名を展開する
pea.l arg1(pc) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi name_er * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg1(pc),a0 *バッファarg1に
lea.l nambuf(pc),a1 * nameckで展開したパス名+'*.GL?'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg1(pc) * 検索してみる
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg1(pc),a0 *バッファarg1に
lea.l komekome(pc),a1 * もとのファイル名+'\*.GL?'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg1以降に格納する *
*****************************************************************
setpath:
lea.l arg1(pc),a0 *a0=コピー先
lea.l nambuf(pc),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(pc),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg1(pc),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #".",(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg1(pc),a0 *a0=引数切り出し領域
addq.l #1,a2 *a2=コマンドライン文字列先頭
move.w #1,clr_mode *画面クリアモードの初期値
clr.w crt_mode *画面モード初期値
clr.w x_pos *ロード座標の初期化
clr.w y_pos
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmpi.b #'K',d0 *Kスイッチ?
beq ksw * そうなら分岐
cmpi.b #'S',d0
beq ssw
cmpi.b #'C',d0
beq csw
cmpi.b #'L',d0
beq lsw
cmpi.b #'M',d0
beq msw
cmpi.b #'R',d0
beq rsw
bra usage *無効なスイッチが指定された
ksw:
tst.b kflg *スイッチの二重指定チェック
bne usage
st kflg *KスイッチON
bra switch_chk *まだスイッチがあるかもしれない
ssw:
bsr ssw_ana
bra switch_chk
csw:
bsr csw_ana
bra switch_chk
lsw:
bsr lsw_ana
bra switch_chk
msw:
tst.b mflg
bne usage
st mflg
bra switch_chk
rsw:
tst.b rflg
bne usage
st rflg
bra switch_chk
switch_chk2:
rts
*****************************************************************
* Sスイッチの解析 *
*****************************************************************
ssw_ana:
tst.b sflg *Sスイッチの2重指定
bne usage
st sflg
move.b (a2),d0 *1文字取り出す
cmp.b #' ',d0 *Sだけかな
beq ssw_ana9 *画面モードの指定なし
bsr num_read *
cmp.w crt_max(pc),d0 *
bhi usage
move.w d0,crt_mode
subq.l #1,a2 *1文字戻す
ssw_ana9:
rts
*****************************************************************
* Cスイッチの解析 *
*****************************************************************
csw_ana:
tst.b cflg *Cスイッチの2重指定
bne usage
st cflg
move.b (a2),d0 *1文字取り出す
cmp.b #' ',d0 *Cだけかな
beq csw_ana9 *画面クリアモードの指定なし
bsr num_read
cmp.w #3,d0
bhi usage
move.w d0,clr_mode
subq.l #1,a2 *1文字戻す
csw_ana9:
rts
*****************************************************************
* Lスイッチの解析 *
*****************************************************************
lsw_ana:
move.b (a2),d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmp.b #'C',d0 *LCかな
bne lsw_ana1
tst.b lflg *Lスイッチも指定している
bne usage
tst.b lcflg *LCスイッチの2重指定
bne usage
st lcflg *LCスイッチオン
addq.l #1,a2 *1文字進める
bra lsw_ana9
lsw_ana1:
cmp.b #' ',d0 *Lだけかな
bne lsw_ana2 *ロード座標を指定している
clr.w x_pos *ロード座標を0,0
clr.w y_pos
bra lsw_ana9
lsw_ana2:
bsr num_read *Xチェック
cmp.w #511,d0 *Xが511を越える時
bhi but_pos
move.w d0,x_pos
cmp.b #',',-1(a2)
bne usage
bsr num_read *Yチェック
cmp.w #511,d0 *Yが511を越える時
bhi but_pos
move.w d0,y_pos
st lflg *Lスイッチオン
subq.l #1,a2 *1文字戻す
lsw_ana9:
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* 数字の解析 d0に数字を返す *
*****************************************************************
num_read:
clr.w d0
num_read0:
clr.w d1
move.b (a2)+,d1
sub.b #'0',d1
cmp.b #10,d1
bcc.b num_read1
mulu #10,d0
add.w d1,d0
bra.b num_read0
num_read1:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
sf skip_flg *スキップフラグ初期化
lea.l arg1(pc),a0 *ファイル名セット
bsr file_open *ファイルオープン
bsr file_size *ファイルサイズをチェック
move.l d6,fi_size
bsr ext_chk *拡張子とファイルサイズのチェック
tst.b skip_flg
bne main8
move.l buff_size(pc),d0 *メモリチェック
cmp.l fi_size(pc),d0
bcs main9
bsr crtmode_set *画面モードの設定
bsr scroll_set *スクロール変数の設定
bsr lsw_chk *ロード座標・センタリングチェック
tst.b int_flg *1回目のグラフィック初期化ここで行う
bne main2
* bsr gr_off *グラフィック画面オフ
bsr scr_int *画面の初期化
bsr crtmode_int *画面モードの初期化
bsr scroll_int *スクロール座標の初期化
bsr gr_int *グラフィック画面の初期化チェック
main2:
movea.l buff_addr(pc),a4 *ファイル読む
move.l fi_size(pc),d6
bsr file_read
bsr file_close *ファイルクローズ
tst.b int_flg *2回目以降のグラフィック初期化ここで行う
beq main3
bsr gr_off *グラフィック画面オフ
* bsr crtmode_int *画面モードの初期化
bsr scroll_int *スクロール座標の初期化
bsr gr_int *グラフィック画面の初期化チェック
main3:
bsr gr_on *グラフィック画面オン
bsr inf_mode *
bsr bit24_prt *最初の1画面表示
bsr scroll *グラフィックをスクロール
add.w #1,file_cnt *ファイル数のカウント+1
rts
main8:
bsr file_close
rts
main9:
bsr file_close
bsr no_buff2
st skip_flg
rts
*****************************************************************
* 拡張子のチェック *
*****************************************************************
ext_chk:
lea.l arg1(pc),a0
lea.l ext_buff(pc),a1
clr.l (a1)
move.l #64+21-1,d0 *
ext_chk0:
cmp.b #'.',(a0)+
beq ext_chk1
dbra.w d0,ext_chk0
bra not_ext
ext_chk1:
subq.l #1,a0
move.b (a0)+,d0 *拡張子コピー
bsr toupper
move.b d0,(a1)+
move.b (a0)+,d0
bsr toupper
move.b d0,(a1)+
move.b (a0)+,d0
bsr toupper
move.b d0,(a1)+
move.b (a0)+,d0
bsr toupper
move.b d0,(a1)+
subq.l #4,a1
cmp.l #".GL0",(a1) *拡張子チェック
beq ext_gl0
cmp.l #".GL3",(a1)
beq ext_gl3
cmp.l #".GLX",(a1)
beq ext_glx
cmp.l #".GLM",(a1)
beq ext_glm
cmp.l #256*256*2,fi_size *ファイルサイズでチェック
beq ext_gl0
cmp.l #512*512*2,fi_size
beq ext_gl3
bra not_ext
ext_gl0:
move.w #256,yoko
move.w #256,tate
bra ext_chk9
ext_gl3:
move.w #512,yoko
move.w #512,tate
bra ext_chk9
ext_glx:
movea.l buff_addr(pc),a4 *ファイル読む
moveq.l #4,d6
bsr file_read
move.w (a4)+,d0
ror.w #8,d0
move.w d0,yoko
move.w (a4)+,d0
ror.w #8,d0
move.w d0,tate
bra ext_chk9
ext_glm:
movea.l buff_addr(pc),a4 *ファイル読む
moveq.l #16,d6
bsr file_read
cmp.l #"GR65",(a4)
bne not_glx
move.w 12(a4),yoko
move.w 14(a4),tate
* bra ext_chk9
ext_chk9:
move.w yoko(pc),d0 *1ラインのバイト数
add.w d0,d0
move.w d0,line_byte
mulu.w tate(pc),d0 *画像のサイズ
move.l d0,fi_size
rts
not_ext:
lea.l arg1(pc),a0 *スキップする
bsr mesput
lea.l not_ext_mes(pc),a0
bsr mesput
st skip_flg
rts
not_glx:
lea.l arg1(pc),a0 *GLxでない
bsr mesput
lea.l not_glx_mes(pc),a0
bsr mesput
st skip_flg
rts
*****************************************************************
* ロード座標のチェック *
*****************************************************************
lsw_chk:
tst.b lflg *Lスイッチ指定
bne l_chk *指定あり
tst.b lcflg *LCスイッチ指定
bne lc_chk *指定あり
rts
l_chk:
move.w x_pos(pc),d0 *横にはみ出るか
beq l_chk1
add.w yoko(pc),d0
cmp.w crt_x(pc),d0
bhi but_pos *はみ出る
l_chk1
move.w y_pos(pc),d0 *縦にはみ出るか
beq l_chk2
add.w tate(pc),d0
cmp.w crt_y(pc),d0
bhi but_pos *はみ出る
l_chk2
rts
lc_chk:
clr.w x_pos *ロード座標を初期化
clr.w y_pos
move.w crt_x(pc),d0 *X方向のセンタリング
sub.w yoko(pc),d0
bmi lc_chk1
lsr.w #1,d0 *d0を1/2
move.w d0,x_pos
lc_chk1:
move.w crt_y(pc),d0 *Y方向のセンタリング
sub.w tate(pc),d0
bmi lc_chk2
lsr.w #1,d0 *d0を1/2
move.w d0,y_pos
lc_chk2:
rts
*****************************************************************
* スクロール画面の初期化 *
*****************************************************************
scroll_int:
clr.w d2 *スクロール座標初期化
clr.w d3
bsr x_set
bsr y_set
rts
*****************************************************************
* 画面モードの設定 *
*****************************************************************
crtmode_set:
move.w #$03,vctr_r0
move.w #$2f,vctr_r2
rts
*****************************************************************
* スクロール変数の設定 *
*****************************************************************
scroll_set:
lea.l dot_tbl(pc),a0 *ドット数テーブル
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
move.w (a0),crt_x *CRTのXドット数
move.w 2(a0),crt_y * Yドット数
move.w yoko(pc),d0 *横スクロール出来るドット数を計算
sub.w crt_x(pc),d0
bpl scroll_set0
clr.w d0
scroll_set0:
move.w d0,x_max
move.w tate(pc),d0 *縦スクロール出来るドット数を計算
sub.w crt_y(pc),d0
bpl scroll_set1
clr.w d0
scroll_set1:
move.w d0,y_max
rts
*****************************************************************
* 画面の初期化を行う *
*****************************************************************
scr_int:
st int_flg *画面の初期化は一回だけ
move.w clr_mode(pc),d0 *テキスト画面消去の指定があるか
btst.l #0,d0
beq scr_int9 *指定無し
IOCS _MS_CUROF *マウスカーソル消す
moveq.l #0,d1 *ソフトキーボード消す
moveq.l #0,d2
IOCS _SKEY_MOD
bsr func_off *ファンクションキー消す
bsr text_clr *テキストクリア
move.w #$1e,d1 *カーソルをHOMEポジションへ
IOCS _B_PUTC
scr_int9:
rts
*****************************************************************
* 画面のモードの初期化を行う *
*****************************************************************
crtmode_int:
move.w vctr_r0(pc),$e82400 *色モード・実画面サイズ設定
move.w #$06e4,$e82500 *画面の優先順位
cmp.w #2,clr_mode *グラフィック画面消去の指定
bcs crtmode_int1 *指定無し
move.w #$0020,$e82600 *GRoff・TEXTon
bra crtmode_int2
crtmode_int1:
move.w vctr_r2(pc),$e82600 *GR・TEXT画面オン
crtmode_int2:
bsr v_wait
bsr crtc_set *crtcレジスタ設定
rts
*****************************************************************
* グラフィック画面の消去 *
*****************************************************************
gr_int:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_int9 *指定無し
gr_int0:
cmp.w #1,crt_mode *15kHzはMPUクリア
beq gr_int1
tst.b mflg *強制MPUクリア?
beq gr_int3
gr_int1:
movem.l d0-d7/a0-a6,-(sp)
moveq.l #0,d0 *レジスタクリア
move.l d0,d1
move.l d0,d2
move.l d0,d3
move.l d0,d4
move.l d0,d5
move.l d0,d6
move.l d0,d7
movea.l d0,a1
movea.l d0,a2
movea.l d0,a3
movea.l d0,a4
movea.l d0,a5
movea.l d0,a6
movea.l #GRAM_MAX,a0
move.w #512,line_cnt
gr_int2:
movem.l d0-d7/a1-a6,-(a0) *14*4=56
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d3,-(a0)
subq.w #1,line_cnt
bne gr_int2
movem.l (sp)+,d0-d7/a0-a6
rts
gr_int3:
move.w $e8002a,-(sp) *ハードウェアクリア
bsr v_wait
move.w #$0f,$e8002a
move.b #$02,$e80481
bsr v_wait
bsr v_wait
bsr v_wait
move.w (sp)+,$e8002a
gr_int9:
rts
*****************************************************************
* グラフィックのオン *
*****************************************************************
gr_on:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_on1
gr_on0:
bsr v_wait
ori.w #$002f,$e82600 *GRon・TEXTon
gr_on1:
rts
*****************************************************************
* グラフィックのオフ *
*****************************************************************
gr_off:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_off1
gr_off0:
bsr v_wait
andi.w #$ffe0,$e82600 *GRoff
gr_off1:
rts
*****************************************************************
* 標準パレットの設定 *
*****************************************************************
pal_set:
moveq.l #$0001,d0
move.l #$0202,d1
movea.l #GPAL,a0
moveq.l #512/4-1,d2
pal_set1:
move.w d0,(a0)+
move.w d0,(a0)+
add.l d1,d0
dbra.w d2,pal_set1
rts
*****************************************************************
* 画像データを一気に表示する *
*****************************************************************
bit24_prt:
move.w x_pos(pc),gram_x *表示開始座標
move.w y_pos(pc),gram_y
clr.w glx_x
clr.w glx_y
move.w yoko(pc),d0
cmp.w #512,d0 *横ドット数が512を超えるか
bls bit24_prt1
move.w #512,d0
bit24_prt1:
move.w d0,glx_xd
move.w d0,x_line
move.w tate(pc),d0
cmp.w #512,d0 *横ドット数が512を超えるか
bls bit24_prt2
move.w #512,d0
bit24_prt2:
move.w d0,glx_yd
move.w d0,y_line
bsr get_glx_addr
bsr get_gram_addr
tst.b mflg
bne bit24_prt3
bsr dma_move *DMAで表示
bra bit24_prt4
bit24_prt3:
bsr g24 *MPUで表示
bit24_prt4:
rts
*****************************************************************
* DMAを使ってグラフィックへ転送する *
*****************************************************************
dma_move:
move.w glx_yd(pc),d0 *転送サイズ縦
move.w glx_xd(pc),d1 *転送サイズ横
movea.w line_byte(pc),a3 *転送元画像の横サイズ
sub.w #1,d0 *縦ライン-1
move.b #$FF,CSR2
move.b #8,DCR2
btst.l #0,d1 *横ライン数が偶数か
beq dma_move0 *そう
move.b #$11,OCR2 *ワード転送
bra dma_move1
dma_move0:
move.b #$21,OCR2 *ロングワード転送
lsr.w #1,d1 *d1を1/2
dma_move1:
move.b #%0_000_0101,SCR2
move.b #3,CPR2
clr.b CCR2
move.b #5,DFC2
move.b #5,MFC2
dma_move2:
move.w d1,MTC2 *転送サイズ
move.l a1,MAR2 *転送元
move.l a2,DAR2 *転送先
move.b #$80,CCR2
dma_move3:
tst.w MTC2
bne dma_move3
move.b #$FF,CSR2
adda.l a3,a1 *転送元アドレス更新
lea.l 1024(a2),a2 *転送先アドレス更新
dbra.w d0,dma_move2
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
sf esc_flg *フラグ初期化
sf next_flg
sf resize_flg
sf inkey_flg1
sf inkey_flg2
sf inkey_flg3
moveq.l #0,d2 *スクロール座標初期化
moveq.l #0,d3
clr.w x_old
clr.w y_old
bsr down_demo
bsr right_demo
tst.b kflg *キー入力待ち
beq scroll8 *指定無し
scroll2:
bsr key_chk *キー入力チェック
* bsr mouse_chk *マウスのキー入力チェック
tst.b esc_flg *エスケープ入力
bne scroll9
tst.b next_flg *ネクスト入力
bne scroll9
tst.b resize_flg *縮小表示
bne scroll6
bsr cursor_chk *カーソル入力チェック
bsr tenkey_chk *テンキー入力チェック
bsr mouse_chk *マウス入力チェック
bsr go_scroll *スクロール実行
bsr v_wait *手抜き
bra scroll2 *キー入力に戻る
scroll6: *一画面表示
bsr gr_off0
bsr gr_int0
bsr gr_on0
bsr scroll_int
bsr resize
scroll6_:
bsr key_chk
bsr mouse_chk
tst.b esc_flg
bne scroll9
tst.b next_flg
bne scroll9
tst.b resize_flg
bne scroll6_
scroll7: *書き戻し
bsr gr_off0
bsr gr_int0
bsr gr_on0
bsr rewrite
bra scroll2
scroll8:
bsr key_chk *ESCくらいは入力チェック
bsr mouse_chk *マウスのキー入力チェック
scroll9:
rts
*****************************************************************
* キー入力チェック *
*****************************************************************
key_chk:
movea.w #$800,a0
btst.b #1,(a0) *ESCが押されたか?
beq key_chk_ *押されていない
st esc_flg *ESCスイッチON
bra key_chk9
key_chk_:
btst.b #7,1(a0) *BSが押されたか?
beq key_chk0 *押されていない
st esc_flg *ESCスイッチON
bra key_chk9
key_chk0:
btst.b #5,3(a0) *RETURNが押されたか?
beq key_chk1 *押されていない
st next_flg *NEXTスイッチON
bra key_chk9
key_chk1:
btst.b #5,6(a0) *SPACEが押されたか?
beq key_chk2
st next_flg
bra key_chk9
key_chk2:
btst.b #6,9(a0) *ENTERが押されたか?
beq key_chk3
st next_flg
bra key_chk9
key_chk3:
btst.b #6,6(a0) *HOMEが押されたか?
beq key_chk4
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
bsr inf_change *情報表示の変更
bra key_chk9
key_chk4:
btst.b #2,7(a0) *UNDOが押されたか?
beq key_chk5
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
not.b resize_flg
bra key_chk9
key_chk5:
btst.b #1,7(a0) *ROLL DOWNが押されたか?
beq key_chk6
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
bsr crt_change0
bra key_chk9
key_chk6:
btst.b #0,7(a0) *ROLL UPが押されたか?
beq key_chk8
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
bsr crt_change
bra key_chk9
key_chk8:
sf inkey_flg1
key_chk9:
rts
*****************************************************************
* カーソル入力チェック *
*****************************************************************
cursor_chk:
movea.w #$807,a0 *カーソルキーのチェック
move.b (a0),d0
ror.b #3,d0
andi.w #$000f,d0
move.b d0,scroll_key
rts
*****************************************************************
* テンキー入力チェック *
*****************************************************************
tenkey_chk:
movea.w #$808,a0
lea.l scroll_key(pc),a1
btst.b #4,(a0) *8押されたか?
beq tenkey_chk0 *押されていない
or.b #2,(a1) *上セット
tenkey_chk0:
btst.b #7,(a0) *4が押されたか?
beq tenkey_chk1 *押されていない
or.b #1,(a1) *右セット
tenkey_chk1:
movea.w #$809,a0
btst.b #1,(a0) *6が押されたか?
beq tenkey_chk2 *押されていない
or.b #4,(a1) *左セット
tenkey_chk2:
btst.b #4,(a0) *2が押されたか?
beq tenkey_chk3 *押されていない
or.b #8,(a1) *下セット
tenkey_chk3:
rts
*****************************************************************
* マウスの入力チェック *
*****************************************************************
mouse_chk:
IOCS _MS_GETDT *マウスからのデータをGET
cmpi.b #$ff,d0 *右ボタンが押されたか
beq mouse_right *押された
andi.w #$ff00,d0 *左ボタンが押されたか
bne mouse_left *押された
sf inkey_flg2
bra mouse_chk1
mouse_right:
andi.w #$ff00,d0 *更に左ボタンが押されたか
bne mouse_right1 *押された
tst.b inkey_flg2
bne mouse_right0
st inkey_flg2
bsr inf_change *情報表示の変更
mouse_right0:
IOCS _MS_GETDT *マウスからのデータをGET
andi.w #$ff00,d0 *左ボタンが押されたか
beq mouse_chk1 *押されていない
mouse_right1:
st esc_flg *ESCスイッチON
bra mouse_chk1
mouse_left:
st next_flg *NEXTスイッチON
mouse_chk1:
swap d0
move.w d0,d1
andi.w #$ff00,d0 *上位を残す
andi.w #$00ff,d1 *下位を残す
ror.w #8,d0 *
lea.l scroll_key(pc),a1
ms_xp: *X方向の移動量を調べる
tst.b d0 *移動量がプラス方向か?
beq ms_yp *入力なし
blt ms_xm *マイナスなら飛ぶ
cmp.b #1,d0
bls ms_yp *移動量が少なければ無視
or.b #4,(a1) *右セット
bra ms_yp
ms_xm:
cmp.b #-1,d0
bcc ms_yp
or.b #1,(a1) *左セット
* bra ms_yp
ms_yp: *Y方向の移動量を調べる
tst.b d1 *移動量がプラス方向か?
beq mouse_chk9 *入力なし
blt ms_ym *マイナスなら飛ぶ
cmp.b #1,d1
bls mouse_chk9 *移動量が少なければ無視
or.b #8,(a1) *下セット
bra mouse_chk9
ms_ym:
cmp.b #-1,d1
bcc mouse_chk9
or.b #2,(a1) *上セット
* bra mouse_chk9
mouse_chk9:
rts
*****************************************************************
* 下方向へ全画面スクロールを行う *
*****************************************************************
down_demo:
tst.w y_max
beq down_demo9
move.w s_dot24(pc),-(sp)
lsr.w s_dot24
down_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne down_demo8
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr v_wait
bsr down
cmp.w y_max(pc),d3
bne down_demo0
down_demo8:
move.w (sp)+,s_dot24
down_demo9:
rts
*****************************************************************
* 右方向へ全画面スクロールを行う *
*****************************************************************
right_demo:
tst.w x_max
beq right_demo9
tst.w d3
bne right_demo9
* move.w y_max(pc),d0
* cmp.w x_max(pc),d0
* bhi right_demo9
move.w s_dot24(pc),-(sp)
lsr.w s_dot24
right_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne right_demo8
tst.b esc_flg
bne right_demo8
tst.b next_flg
bne right_demo8
bsr v_wait
bsr right
cmp.w x_max(pc),d2
bne right_demo0
right_demo8:
move.w (sp)+,s_dot24
right_demo9:
rts
*****************************************************************
* スクロール *
*****************************************************************
go_scroll:
moveq.l #0,d0
move.b scroll_key(pc),d0
add.w d0,d0
add.w d0,d0
movea.l scroll_tbl(pc,d0.w),a0
jsr (a0)
rts
scroll_tbl:
.dc.l null *0000 入力無し
.dc.l left *0001 左
.dc.l up *0010 上
.dc.l left_up *0011 上左
.dc.l right *0100 右
.dc.l null *0101 右左
.dc.l right_up *0110 右上
.dc.l up *0111 右上左
.dc.l down *1000 下
.dc.l left_down *1001 下左
.dc.l null *1010 下上
.dc.l left *1011 下上左
.dc.l right_down *1100 下右
.dc.l down *1101 下右左
.dc.l right *1110 下右上
.dc.l null *1111 下右上左
.even
*****************************************************************
* 入力無し *
*****************************************************************
null:
rts
*****************************************************************
* 右下(手抜き) *
*****************************************************************
right_down:
bsr right
bsr down
rts
*****************************************************************
* 左下(手抜き) *
*****************************************************************
left_down:
bsr left
bsr down
rts
*****************************************************************
* 右上(手抜き) *
*****************************************************************
right_up:
bsr right
bsr up
rts
*****************************************************************
* 左上(手抜き) *
*****************************************************************
left_up:
bsr left
bsr up
rts
*****************************************************************
* 左へ *
*****************************************************************
left:
sub.w s_dot24(pc),d2
tst.w d2
bpl left1
clr.w d2
left1:
bsr x_set
move.w x_old(pc),d5 *何ドットずらすか
sub.w d2,d5
beq left9
move.w d2,d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w d2,glx_x
move.w d5,glx_xd
move.w y_old(pc),glx_y
move.w y_line(pc),glx_yd
bsr get_glx_addr *表示
bsr get_gram_addr
bsr g24
move.w d2,x_old
left9:
rts
*****************************************************************
* 上へ *
*****************************************************************
up:
sub.w s_dot24(pc),d3
tst.w d3
bpl up1
clr.w d3
up1:
move.w y_old(pc),d6 *何ドットずらすか
sub.w d3,d6
beq up9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w d3,d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),glx_x
move.w x_line(pc),glx_xd
move.w d3,glx_y
move.w d6,glx_yd
bsr get_glx_addr
bsr get_gram_addr
bsr g24
bsr y_set
move.w d3,y_old
up9:
rts
*****************************************************************
* 右へ *
*****************************************************************
right:
add.w s_dot24(pc),d2
cmp.w x_max(pc),d2
bls right1
move.w x_max(pc),d2
right1:
bsr x_set
move.w d2,d5 *何ドットずらすか
sub.w x_old(pc),d5
beq right9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
add.w #512,d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),glx_x
add.w #512,glx_x
move.w d5,glx_xd
move.w y_old(pc),glx_y
move.w y_line(pc),glx_yd
bsr get_glx_addr *表示
bsr get_gram_addr
bsr g24
move.w d2,x_old
right9:
rts
*****************************************************************
* 下へ *
*****************************************************************
down:
add.w s_dot24(pc),d3
cmp.w y_max(pc),d3
bls down1
move.w y_max(pc),d3
down1:
bsr y_set
move.w d3,d6 *何ドットずらすか
sub.w y_old(pc),d6
beq down9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),glx_x
move.w x_line(pc),glx_xd
move.w y_old(pc),glx_y
add.w #512,glx_y
move.w d6,glx_yd
bsr get_glx_addr *表示
bsr get_gram_addr
bsr g24
move.w d3,y_old
down9:
rts
*****************************************************************
* 終了時に画面を描き直す *
*****************************************************************
rw_chk:
tst.b rflg
beq rw_end
tst.b skip_flg
bne rw_end
tst.b resize_flg
bne rw_end
move.w d2,d0
add.w d3,d0
beq rw_end
bsr quit_rewrite
rw_end:
rts
*****************************************************************
* 一画面表示 *
*****************************************************************
resize:
bsr parm_set
pea.l arg_ptr(pc)
bsr _Gxput
addq.l #4,sp
rts
parm_set:
lea.l arg_ptr(pc),a0
bsr resize_get
move.w d0,4(a0)
move.w d1,6(a0)
clr.w gram_x
clr.w gram_y
move.w #512,d2 *X方向のセンタリング
sub.w d0,d2
bmi parm_set0
lsr.w #1,d2
move.w d2,gram_x
parm_set0:
move.w #512,d3 *Y方向
sub.w d1,d3
bmi parm_set1
lsr.w #1,d3
move.w d3,gram_y
parm_set1:
bsr get_gram_addr
move.l a2,(a0)
addq.l #8,a0
clr.w glx_x
clr.w glx_y
bsr get_glx_addr
move.l a1,(a0)+
move.w yoko(pc),(a0)+
move.w tate(pc),(a0)+
move.w line_byte(pc),(a0)+
lea.l work_tbl(pc),a1
move.l a1,(a0)+
rts
resize_get:
move.w tate(pc),d0 *縦サイズと横サイズを比べる
cmp.w yoko(pc),d0
beq resize_get2
bhi resize_get1
resize_get0:
move.w #512,d0 *横の方が大きい
move.w tate(pc),d1
mulu.w #512,d1
divu.w yoko(pc),d1
rts
resize_get1:
move.w yoko(pc),d0 *縦の方が大きい
mulu.w #512,d0
divu.w tate(pc),d0
move.w #512,d1
rts
resize_get2:
move.w #512,d0 *同じ
move.w #512,d1
rts
*****************************************************************
* 一画面表示後の描き戻し *
*****************************************************************
rewrite:
move.w x_old(pc),d2
move.w y_old(pc),d3
move.w d2,d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w d3,d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w d2,glx_x
move.w x_line(pc),glx_xd
move.w d3,glx_y
move.w y_line(pc),glx_yd
bsr get_glx_addr *表示
bsr get_gram_addr
bsr x_set
bsr y_set
bsr g24
rts
*****************************************************************
* 終了時の描き戻し *
*****************************************************************
quit_rewrite:
move.w x_pos(pc),gram_x *表示開始X座標
move.w y_pos(pc),gram_y *表示開始Y座標
move.w d2,glx_x
move.w x_line(pc),glx_xd
move.w d3,glx_y
move.w y_line(pc),glx_yd
clr.w d2
clr.w d3
bsr get_glx_addr *表示
bsr get_gram_addr
bsr x_set
bsr y_set
bsr g24
rts
*****************************************************************
* スクロール分のグラフィックを表示する *
* gram_x, gram_y 表示先座標(GRAM) *
* glx_x, glx_y 表示元座標(GLX) *
* glx_xd, glx_yd ドット数 *
*****************************************************************
g24:
movem.l d5-d6,-(sp)
move.w glx_xd(pc),d0 *横ドット数
move.w glx_yd(pc),d7 *縦ドット数
moveq.l #0,d4 *次のラインへのバイト数
move.w line_byte(pc),d4 *(転送元)
sub.w d0,d4
sub.w d0,d4
moveq.l #0,d5 *表示データの1ライン下までの差分
move.w #512,d5 *(表示先)
sub.w d0,d5
add.w d5,d5
move.w gram_x(pc),d6
add.w glx_xd(pc),d6
cmp.w #512,d6
bhi g24_2 *左右2回に分けて表示
cmp.w #1,d0 *表示ライン=横1ドット
beq g24_1
cmp.w #8,d0 *表示ライン=横8ドット
beq g24_8
btst.l #0,d0
beq g24_g *表示ライン=偶数
bra g24_k *表示ライン=奇数
g24_1:
subq.w #1,d7 *dbraのため縦-1
g24_11:
move.w (a1)+,(a2)+
adda.l d4,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_13
suba.l #GRAM_MAX-GRAM,a2
g24_13:
dbra d7,g24_11
bra g24_end
g24_8:
subq.w #1,d7 *dbraのため縦-1
g24_81:
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
adda.l d4,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_83
suba.l #GRAM_MAX-GRAM,a2
g24_83:
dbra d7,g24_81
bra g24_end
g24_g:
lsr.w #1,d0 *1/2
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_g1:
move.w d0,d1
g24_g2:
move.l (a1)+,(a2)+
dbra d1,g24_g2
adda.l d4,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_g3
suba.l #GRAM_MAX-GRAM,a2
g24_g3:
dbra d7,g24_g1
bra g24_end
g24_k:
lsr.w #1,d0 *1/2
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_k1:
move.w d0,d1
g24_k2:
move.l (a1)+,(a2)+
dbra d1,g24_k2
move.w (a1)+,(a2)+
adda.l d4,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_k3
suba.l #GRAM_MAX-GRAM,a2
g24_k3:
dbra d7,g24_k1
bra g24_end
g24_2: *左右2回に分けて表示
add.w #1024,d5 *1ライン下までの差分を補正
move.w #512,d0 *横ドット1
sub.w gram_x(pc),d0
move.w glx_xd(pc),d6 *横ドット2
sub.w d0,d6
subq.w #1,d0 *dbraのため-1
subq.w #1,d6 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_21:
move.w d0,d1 *右側
g24_22:
move.w (a1)+,(a2)+
dbra d1,g24_22
g24_23:
move.w d6,d1 *左側
lea.l -1024(a2),a2
g24_24:
move.w (a1)+,(a2)+
dbra d1,g24_24
adda.l d4,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_25
suba.l #GRAM_MAX-GRAM,a2
g24_25:
dbra d7,g24_21
g24_end:
movem.l (sp)+,d5-d6
rts
*****************************************************************
* GLXデータのアドレスを取得(a1) *
*****************************************************************
get_glx_addr:
move.w line_byte(pc),d0 *line_byte*glx_y + gr_addr + glx_x*2
mulu.w glx_y(pc),d0
add.l gr_addr(pc),d0
movea.l d0,a1
moveq.l #0,d0
move.w glx_x(pc),d0
add.w d0,d0
adda.l d0,a1
rts
*****************************************************************
* GRAMのアドレスを取得(a2) *
*****************************************************************
get_gram_addr:
move.w gram_x(pc),d0 *表示先画像アドレス
move.w gram_y(pc),d1
swap.w d1
clr.w d1
ror.l #6,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
adda.l #GRAM,a2
movea.l #GRAM_MAX,a3 *GRAM_MAX
rts
*****************************************************************
* 画面モード変更 *
*****************************************************************
crt_change: *ROLL UP
addq.w #1,crt_mode
move.w crt_max(pc),d0
cmp.w crt_mode(pc),d0
bcc crt_change1
clr.w crt_mode
bra crt_change1
crt_change0: *ROLL DOWN
subq.w #1,crt_mode
bpl crt_change1
move.w crt_max(pc),crt_mode
bra crt_change1
crt_change1:
bsr gr_off0
bsr crtc_set
bsr gr_on0
rts
*****************************************************************
* CRTCの値を設定する *
*****************************************************************
crtc_set:
lea.l crtc_tbl(pc),a0
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
tst.w (a0)+ *HRL=0?
beq crtc_set0
or.b #%0010,$e8e007 *HRLビットを立てる
bra crtc_set1
crtc_set0:
bclr.b #1,$e8e007 *HRLビットを消す
crtc_set1:
movea.l #$e80000,a1
move.w (a0)+,$28(a1) *crtc r20
move.l (a0)+,(a1)+ *crtc r00-r08
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.w (a0),(a1)
rts
*****************************************************************
* 情報の表示/非表示の変更を行う *
*****************************************************************
inf_change:
add.b #1,prt_flg
cmp.b #2,prt_flg
bcs inf_change1
beq inf_change2
bra inf_change0
inf_change0:
* bsr v_wait
bsr inf_off *情報消去
bsr tone_up
clr.b prt_flg
bra inf_change9
inf_change1:
* bsr v_wait
bsr inf_prt *情報表示
bra inf_change9
inf_change2:
* bsr v_wait
bsr tone_down
inf_change9:
rts
inf_mode:
cmp.b #1,prt_flg
bcs inf_mode9
beq inf_mode1
bra inf_mode2
inf_mode1:
bsr inf_prt *情報表示
bra inf_mode9
inf_mode2:
bsr inf_prt *情報表示
bsr tone_down
inf_mode9:
rts
*****************************************************************
* 情報の表示 *
*****************************************************************
inf_prt:
tst.b prt_flg
beq inf_prt9 *ゼロなら表示しない
bsr v_wait
bsr inf_off
bsr name_prt *ファイル名の表示
bsr size_prt *サイズの表示
* bsr col_prt *色数の表示
inf_prt9:
rts
*****************************************************************
* ファイル名の表示 *
*****************************************************************
name_prt:
lea.l prt_buf(pc),a0 *表示バッファの先頭アドレス
lea.l inf1(pc),a1 *'ファイル名:'をコピー
bsr strcpy
lea.l filbuf(pc),a1 *ファイル名をコピーする
lea.l 30(a1),a1 *
bsr strcpy
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *ファイル名を表示
rts
*****************************************************************
* 画像サイズの表示 *
*****************************************************************
size_prt:
lea.l prt_buf(pc),a0 *コピー先
lea.l inf2(pc),a1 *'画像サイズ:'をコピー
bsr strcpy
movea.l a0,a2
moveq.l #0,d0 *横サイズ
move.w yoko(pc),d0
bsr suji_set
move.b #'x',(a2)+ *'x'
moveq.l #0,d0 *縦サイズ
move.w tate(pc),d0
bsr suji_set
movea.l a2,a0
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *画像サイズを表示
rts
*****************************************************************
* 階調のUP・DOWN *
*****************************************************************
tone_up:
andi.w #$00ff,$e82600 *半輝度オフ
rts
tone_down:
ori.w #$1b00,$e82600 *半輝度オン(参考:JPEGED.R)
rts
*****************************************************************
* 数字の設定 *
*****************************************************************
suji_set:
lea.l num_buf(pc),a0
move.b #0,11(a0) *終了位置
bsr bin2dec
bsr zero_keshi
suji_set1:
move.b (a0)+,(a2)+
bne suji_set1
subq.l #1,a2
rts
*****************************************************************
* 2進=>10進 *
* d0 変換元の数値 a0 変換後の格納アドレス *
*****************************************************************
bin2dec:
movem.l d0-d3/a0-a1,-(sp)
moveq.l #10-1,d1
lea.l exp_tbl(pc),a1
bin2dec0:
clr.b d2
move.l (a1)+,d3
bin2dec1:
or d3,d3
sub.l d3,d0
bcs bin2dec2
addq.b #1,d2
bra bin2dec1
bin2dec2:
add.l d3,d0
add.b #'0',d2
move.b d2,(a0)+
dbra d1,bin2dec0
movem.l (sp)+,d0-d3/a0-a1
rts
exp_tbl:
.dc.l 1000000000
.dc.l 100000000
.dc.l 10000000
.dc.l 1000000
.dc.l 100000
.dc.l 10000
.dc.l 1000
.dc.l 100
.dc.l 10
.dc.l 1
*****************************************************************
* 頭にある'0'を消す *
*****************************************************************
zero_keshi:
lea.l num_buf(pc),a0
move.w #9-1,d0 *最期の'0'は残す
zero_keshi0:
cmp.b #'0',(a0)
bne zero_keshi9
move.b #SPACE,(a0)+
zero_keshi1:
dbra d0,zero_keshi0
zero_keshi9:
rts
*****************************************************************
* 情報の消去 *
*****************************************************************
inf_off:
move.w #$1a,d1 *TEXTクリア&HOMEポジションへ
IOCS _B_PUTC
rts
*****************************************************************
* スクロールX座標セット *
*****************************************************************
x_set:
movea.l #$e80000,a0
move.w d2,crtc_r12(a0)
move.w d2,crtc_r14(a0)
move.w d2,crtc_r16(a0)
move.w d2,crtc_r18(a0)
rts
*****************************************************************
* スクロールY座標セット *
*****************************************************************
y_set:
movea.l #$e80000,a0
move.w d3,crtc_r13(a0) *スクリーン0のY座標
move.w d3,crtc_r15(a0) *スクリーン1のY座標
move.w d3,crtc_r17(a0) *スクリーン2のY座標
move.w d3,crtc_r19(a0) *スクリーン3のY座標
rts
*****************************************************************
* 画面の動機待ち *
*****************************************************************
v_wait:
movea.l #$e88001,a0
moveq.l #4,d0
v_wait0:
btst.b d0,(a0)
beq v_wait0
v_wait1:
btst.b d0,(a0)
bne v_wait1
rts
*****************************************************************
* テキスト画面の消去 *
*****************************************************************
text_clr:
movem.l d0-d3/a3,-(sp)
move.w $E8002A,d0
move.w #%0000_0001_1111_0000,$E8002A
movea.l #TEXT1,a3
move.w #1024-1,d1
text_clr_lp:
clr.l (a3)+
dbra.w d1,text_clr_lp
move.w d0,$E8002A
move.w #$0001,d1
move.w #255,d2
move.w #$000F,d3
IOCS _TXRASCPY
movem.l (sp)+,d0-d3/a3
rts
*****************************************************************
* カーソル消す *
*****************************************************************
cursol_clr:
move.b $992.w,cur_save
beq cursol_clr9
IOCS _OS_CUROF
cursol_clr9:
rts
*****************************************************************
* カーソル戻す *
*****************************************************************
cursol_recv:
tst.b cur_save
beq cursol_recv9
IOCS _OS_CURON
cursol_recv9:
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0 *OK?
bmi open_err
move.l d0,d7 *ファイルハンドルセーブ
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a4,-(sp) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _READ
lea 10(sp),sp *スタック補正
tst.l d0 *OK?
bmi read_err
cmp.l d6,d0 *全部読めたか
bne read_err
rts
*****************************************************************
* ファイルをCLOSEする *
*****************************************************************
file_close:
move.w d7,-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
rts
*****************************************************************
* バッファ確保 *
*****************************************************************
buf_get:
pea.l -1.w *確保出来る最大サイズを取得
DOS _MALLOC
addq.l #4,sp
andi.l #$00ffffff,d0
move.l d0,d1
move.l d0,-(sp)
DOS _MALLOC
addq.l #4,sp
tst.l d0
bmi no_buff1
move.l d0,buff_addr *バッファアドレス
move.l d1,buff_size *バッファサイズ
rts
*****************************************************************
* バッファ開放 *
*****************************************************************
buf_free:
pea.l buff_addr(pc) *バッファ開放
DOS _MFREE
addq.l #4,sp
rts
*****************************************************************
* スーパーモードにする *
*****************************************************************
super:
clr.l -(sp) *スーパーバイザモードへ移行
DOS _SUPER
addq.l #4,sp
move.l d0,sp_save
rts
*****************************************************************
* ユーザーモードにする *
*****************************************************************
user:
move.l sp_save(pc),-(sp) *ユーザーモードへ
DOS _SUPER
addq.l #4,sp
rts
*****************************************************************
* ファンクション表示を消す *
*****************************************************************
func_off:
lea.l func_off_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
tst.w file_cnt *処理したファイルは0個か
bne file_cnt_chk1 *違う
bsr no_file *ファイルが無かった
file_cnt_chk1:
rts
*****************************************************************
* 処理するファイルがなかった *
*****************************************************************
no_file:
lea.l no_file_mes(pc),a0
bsr mesput
rts
*****************************************************************
* ファイル名エラー *
*****************************************************************
name_er:
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メモリが全くない *
*****************************************************************
no_buff1:
lea.l no_buff_mes1(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メモリが足りない *
*****************************************************************
no_buff2:
lea.l arg1(pc),a0
bsr mesput
lea.l no_buff_mes2(pc),a0
bsr mesput
rts
*****************************************************************
* ロード座標エラー *
*****************************************************************
but_pos:
bsr file_close *ファイルクローズ
lea.l arg1(pc),a0
bsr mesput
lea.l but_pos_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg1(pc),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg1(pc),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
bsr cursol_recv *カーソル戻す
IOCS _MS_INIT *キーバッファクリア
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w #-1,-(sp)
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b 'GLx Loader V0.08+ by A.MUKAWA',CR,LF
.dc.b '機能:GL0,GL3,GLM,GLXファイルを表示します',CR,LF
.dc.b '用法:LDGLX [スイッチ] ファイル名',CR,LF
.dc.b CR,LF
.dc.b ' /L[x,y] ロード座標の指定',CR,LF
.dc.b ' /LC 画面中央に表示',CR,LF
.dc.b ' /K 表示後にキー入力待ち',CR,LF
.dc.b ' /Sn 画面モードの設定(n=0~2)',CR,LF
.dc.b ' n=0 512*512 31k 標準モード(DEF)',CR,LF
.dc.b ' n=1 512*512 15k 標準モード',CR,LF
.dc.b ' n=2 512*512 31k 正方形モード',CR,LF
.dc.b ' /Cn 画面クリアモードの設定(n=0~3)',CR,LF
.dc.b ' 0:画面消去を行わない',CR,LF
.dc.b ' 1:テキスト画面のみ消去(DEF)',CR,LF
.dc.b ' 2:グラフィック画面のみ消去',CR,LF
.dc.b ' 3:テキスト画面とグラフィック画面を消去',CR,LF
.dc.b ' /M MPUに頑張ってもらう',CR,LF
.dc.b ' /R 終了時に画面を描き直す',CR,LF
.dc.b 0
no_file_mes:
.dc.b '表示できるファイルがありません!',CR,LF,0
name_er_mes:
.dc.b 'ファイル名の指定に間違いがあります!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
but_pos_mes:
.dc.b ' は指定した座標にロード出来ません!',CR,LF,0
not_glx_mes:
.dc.b ' は壊れているか、GLxファイルではありません!',CR,LF,0
not_ext_mes:
.dc.b ' はスキップします',CR,LF,0
no_buff_mes1:
.dc.b 'メモリの余裕が全くありません!',CR,LF,0
no_buff_mes2:
.dc.b ' の表示に必要なメモリがありません!',CR,LF,0
crlf_mes:
.dc.b CR,LF,0
func_off_mes:
.dc.b $1b,$5b,$3e,$31,$68,0
dext:
.dc.b '.GL?',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.GL?',0
.even
kflg: .dcb.b 1,0 */Kスイッチon/offフラグ(=0...off,<>0...on)
sflg: .dcb.b 1,0 */Sスイッチon/offフラグ(=0...off,<>0...on)
cflg: .dcb.b 1,0 */Cスイッチon/offフラグ(=0...off,<>0...on)
lflg: .dcb.b 1,0 */Lスイッチon/offフラグ(=0...off,<>0...on)
lcflg: .dcb.b 1,0 */LCスイッチon/offフラグ(=0...off,<>0...on)
mflg: .dcb.b 1,0 */Mスイッチon/offフラグ(=0...off,<>0...on)
rflg: .dcb.b 1,0 */Rスイッチon/offフラグ(=0...off,<>0...on)
int_flg: .dcb.b 1,0 *
prt_flg: .dcb.b 1,0 *画像情報の表示/非表示フラグ
.even
s_dot24:
.dcb.w 1,8
crt_max:
.dc.w 3-1
crtc_tbl:
.dc.l mode0
.dc.l mode1
.dc.l mode2
crtc_data:
* HRL R20 R00 R01 R02 R03 R04 R05 R06 R07 R08
mode0: .dc.w $00,$315, $5B, $09, $11, $51,$237, $05, $28,$228, $1B *512*512
mode1: .dc.w $00,$305, $4B, $03, $05, $45,$103, $02, $10,$100, $2C *512*512 Low
mode2: .dc.w $00,$316, $89, $0E, $2C, $6C,$237, $05, $28,$228, $1B *512*512 正方形 中央
dot_tbl:
.dc.l dot0
.dc.l dot1
.dc.l dot2
dot_data:
dot0: .dc.w 512,512
dot1: .dc.w 512,512
dot2: .dc.w 512,512
inf1: .dc.b 'ファイル名:',0
inf2: .dc.b '画像サイズ:',0
.even
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg1:
.ds.b 256 *ファイル名バッファ
prt_buf:
.ds.b 96+3 *画面表示バッファ
num_buf:
.ds.b 10+1 *数値変換バッファ
.even
ext_buff:
.ds.l 1 *拡張子バッファ
file_cnt:
.ds.w 1 *ファイル数のカウント用バッファ
sp_save:
.ds.l 1
buff_addr:
.ds.l 1 *画像読み込みバッファアドレス
buff_size:
.ds.l 1 *画像読み込みバッファサイズ
gr_addr:
.ds.l 1 *画像データアドレス
fi_size:
.ds.l 1 *ファイルサイズ
yoko:
.ds.w 1 *画像の横(X)サイズ
tate:
.ds.w 1 *画像の縦(Y)サイズ
line_byte:
.ds.w 1 *1ラインのバイト数
crt_mode:
.ds.w 1 *画面モード
crt_x:
.ds.w 1 *画面のXサイズ
crt_y:
.ds.w 1 *画面のYサイズ
x_pos:
.ds.w 1 *ロード時のX座標
y_pos:
.ds.w 1 *ロード時のY座標
x_max:
.ds.w 1 *横スクロール数
y_max:
.ds.w 1 *縦スクロール数
clr_mode:
.ds.w 1 *画面クリアモード
vctr_r0:
.ds.w 1
vctr_r2:
.ds.w 1
line_cnt:
.ds.w 1
esc_flg:
.ds.b 1 *
next_flg:
.ds.b 1 *
resize_flg:
.ds.b 1 *
inkey_flg1:
.ds.b 1 *
inkey_flg2:
.ds.b 1 *
inkey_flg3:
.ds.b 1 *
skip_flg:
.ds.b 1 *画像表示のスキップフラグ
scroll_key:
.ds.b 1 *スクロール処理のキー
cur_save:
.ds.b 1 *
.even
gram_x .ds.w 1 *表示する座標(GRAM)
gram_y .ds.w 1
glx_x .ds.w 1 *表示する座標(GLX)
glx_y .ds.w 1
glx_xd .ds.w 1 *表示するドット数
glx_yd .ds.w 1
x_line:
.ds.w 1 *横ドット数
y_line:
.ds.w 1 *縦ドット数
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
arg_ptr:
.ds.b 4+2*2+4+2*2+2+4
work_tbl:
.ds.b 1024
my_stack:
.ds.l 1024
mysp:
.end start